# Darren
# 2025年02月20日22时59分25秒

# 题 1
def cal_score(name, exam, homework=0, bonus=0):
    """
    计算学生成绩
    :param name: 名字
    :param exam: 考试成绩
    :param homework: 作业成绩
    :param bonus: 奖励分
    :return:
    """
    print(f"学生{name}的成绩是{exam * 0.5 + homework * 0.3 + bonus * 0.2}")


cal_score("小明", 50, 40)  # 小明无奖励分
cal_score("小美", 90, bonus=100)  # 小美没做作业

print('-' * 50)


# 题 2
def print_info(name, *args, **kwargs):
    print(f"{name}的爱好是{' '.join(args)}")
    for k, v in kwargs.items():
        print(f"{k}:{kwargs[k]}", end=" ")


person_name = "小李"
print_info(person_name, '弹吉他', '跑步', '耍手机', 性别="男", 年龄=23, 身份='学生')
print()
print('-' * 50)


# 题3
class Dog:
    def __init__(self):
        self.color = "黄颜色"
        self.name = "小黄"

    def bark(self):
        print(f"{self.color} 的狗狗 {self.name} 正在汪汪叫")

    def wag_tail(self):
        print(f"{self.color} 的狗狗 {self.name} 正在摇尾巴")


dog = Dog()
dog.bark()
dog.wag_tail()
print('-' * 50)


# 题 4
# 创建一个 BankAccount 类，用于表示银行账户。该类包含以下属性和方法：
# 属性：account_number（账户号码）、balance（账户余额，初始值为 0）。
# 方法：deposit（存款，接受一个金额参数，将该金额添加到账户余额中）、
# withdraw（取款，接受一个金额参数，如果余额足够则扣除该金额，否则打印提示信息）、
# get_balance（返回当前账户余额）。
class BankAccount:
    def __init__(self, account_number):
        self.account_number = account_number
        self.balance = 0

    def deposit(self, cash):
        self.balance += cash
        print("存款%.2f" % cash)

    def withdraw(self, cash):
        if self.balance >= cash:
            self.balance -= cash
            print("取款%.2f" % cash)
        else:
            print("金额不足")

    def get_balance(self):
        return self.balance


a = BankAccount('022137')
a.deposit(10000)
a.withdraw(20000)
a.withdraw(8000)
print("如今余额%.2f" % a.get_balance())
print('-' * 50)


# 题5
# 创建一个 User 类，包含以下属性和方法：
# 私有属性：__username（用户名）、__password（密码）。
# 公有方法：set_username（设置用户名）、set_password（设置密码）、get_username（获取用户名）、authenticate（验证密码，调用私有方法 __check_password）。
# 私有方法：__check_password（检查密码是否正确）。
class User:
    def __init__(self):
        self.username = None
        self.__password = None

    def set_username(self, str_name):
        self.username = str_name

    def set_password(self, str_pwd):
        self.__password = str_pwd

    def get_username(self):
        return self.username

    def __check_password(self, str_pwd):
        if self.__password == str_pwd:
            return True
        else:
            return False

    def authenticate(self, str_pwd):
        self.__check_password(str_pwd)


xiaoming = User()
xiaoming.set_username("小明")
xiaoming.set_password("012345")
print(f"xiaoming的账号是{xiaoming.get_username()}")
if xiaoming.authenticate('012345'):
    print("密码正确")
else:
    print("密码错误，请重试")

print('-' * 50)


# 题6
# 设计一个简单的交通工具系统，包含一个父类 Vehicle 和一个子类 Bicycle。具体要求如下：
class Vehicle:
    def __init__(self, brand):
        self.brand = brand
        self.speed = 0

    def accelerate(self, speed_increase):
        if self.speed + speed_increase > 100:
            self.speed = 100
            print("已达最大速度100")
        else:
            self.speed += speed_increase
            print(f"当前速度{self.speed}")

    def decelerate(self, speed_decrease):
        if self.speed - speed_decrease < 0:
            self.speed = 0
            print("已停止")
        else:
            self.speed -= speed_decrease
            print(f"当前速度{self.speed}")


class Bicycle(Vehicle):
    def __init__(self, brand):
        super().__init__(brand)
        self.has_basket = False

    def __str__(self):
        text = '有篮子'
        if not self.has_basket:
            text = '没有篮子'
        return "%s的%s牌自行车开始行驶" % (text, self.brand)

    def ring_bell(self):
        print("叮叮叮，自行车按铃啦！")

    def accelerate(self, speed_increase):
        if self.speed + speed_increase > 20:
            self.speed = 20
            print("已达最大速度20")
        else:
            self.speed += speed_increase
            print(f"当前速度{self.speed}")


dazhong = Vehicle('大众')
dazhong.accelerate(100)
fenghuang = Bicycle('凤凰')
fenghuang.has_basket = True
print(fenghuang)
fenghuang.accelerate(15)
fenghuang.accelerate(30)
fenghuang.ring_bell()

print('-' * 50)



class Flyable:
    def behavior(self):
        print("正在飞行")


class Swimmable:
    def behavior(self):
        print("正在游泳")

    def behavior1(self):
        print("叫两声")


class Duck(Flyable, Swimmable):
    pass


xiaohuang = Duck()
print(Duck.__mro__)
xiaohuang.behavior()
xiaohuang.behavior1()
print('-' * 50)


# 题7
class PrintMac:
    instance = None

    def __new__(cls, *args, **kwargs):
        if cls.instance is None:
            print("分配空间ing")
            cls.instance = super().__new__(cls)
        return cls.instance

    def __init__(self, name):
        print("初始化ing")
        self.name = name
        print("完成")


machine1 = PrintMac("打印机")
machine2 = PrintMac("打印机2")
print(id(machine1))
print(id(machine2))
